//方法1
var myPow = function (x, n) {
  if (n === 0) return 1; // n=0直接返回1
  if (n < 0) {
    //n<0时 x的n次方等于1除以x的-n次方分
    return 1 / myPow(x, -n);
  }
  if (n % 2) {
    //n是奇数时 x的n次方 = x*x的n-1次方
    return x * myPow(x, n - 1);
  }
  return myPow(x * x, n / 2); //n是偶数，使用分治，一分为二，等于x*x的n/2次方
};

//方法2
var myPow = function (x, n) {
  if (n < 0) {
    x = 1 / x;
    n = -n;
  }
  let result = 1;
  while (n) {
    if (n & 1) result *= x; //判断n的二进制最后一位是否是1， 如果是1则将结果乘以x
    x *= x;
    n >>>= 1;
    //进行无符号右移1位，此处不能使用有符号右移（>>）
    //当n为-2^31转换成正数时的二进制位“10000000000000000000000000000000” , 如果采用有符号右移时会取最左侧的数当符号即（1），所以返回的结果是 -1073741824
    /*
        C++ 中只有一种右移运算符——>>。它的定义如下：移出的低位舍弃；如果是无符号数，高位补0；如果是有符号数，高位补符号位。
        而JavaScript中有两种右移运算符——>>和>>>。其中>>是有符号右移，即高位补符号位；>>>是无符号右移，高位无脑补0（可能会出现负数变正数，正数变负数的异常情况）。
      */
  }
  return result;
};
